package com.skilltrack.enrol.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * <P>
 *        Mybatis-Plus 配置
 * </p>
 */
@MapperScan("com.skilltrack.enrol.mapper")
//扫描指定包下的所有 Mapper 接口，自动注册为 Spring 管理的 Bean。   类似代替了在每个mapper接口上写@Mapper注解
//这样可以确保所有的 Mapper 接口（例如 CourseBaseMapper）能够被正确注入和使用。
@Configuration
public class MybatisPlusConfig {

    /*
    分页插件的原理：
    首先分页参数放到ThreadLocal中，拦截执行的sql，根据数据库类型添加对应的分页语句重写sql，
    例如：(select * from table where a) 转换为 (select count(*) from table where a)和(select * from table where a limit ,)
    计算出了total总条数、pageNum当前第几页、pageSize每页大小和当前页的数据，是否为首页，是否为尾页，总页数等。
    */

    /**
     * 定义分页拦截器
     * 负责拦截要执行的sql，并添加分页语句，计算分页参数，并返回分页结果。
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //分页插件
        //DbType.MYSQL表示数据库类型，如果数据库类型是MYSQL，则添加分页语句，如果数据库类型不是MYSQL，则不添加分页语句
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //MybatisPlusInterceptor类似于装饰器，可以添加多个内部拦截器，用于处理不同的逻辑。
        //而PaginationInnerInterceptor表示分页插件的内部拦截器，用于处理分页相关的逻辑             类似定义拦截的规则。
        //装饰器添加PaginationInnerInterceptor后即可启用PaginationInnerInterceptor这个拦截器     类似于启动被添加的"规则"。
        return interceptor;
    }







}
